﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

//int main()
//{
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	int i = 0;
//	for (int i = 0; i < 10; i++)
//	{
//		*(p + i) = i+1;
//	}
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	free(p);
//	p = null;
//
//	return 0;
//}

//int main()
//{
//	//int* p = (int*)malloc(10 * sizeof(int));
//	int* p = (int*)calloc(10, sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	free(p);
//	p = NULL;
//
//	return 0;
//}

//int main()
//{
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (p == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	int i = 0;
//	for (int i = 0; i < 10; i++)
//	{
//		*(p + i) = i+1;
//	}
//	for (int i = 0; i < 10; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//	//若10个整形不够，扩大为20个整形
//	int* ptr = (int*)realloc(p, 20 * sizeof(int));
//	if (ptr != NULL)
//	{
//		p = ptr;
//	}
//	else
//	{
//		perror("realloc");
//		return 1;
//	}
//	free(p);
//	p = NULL;
//
//	return 0;
//}

//int main()
//{
//	int* p = (int*)realloc(NULL, 10 * sizeof(int));//等价于malloc(10*sizeof(int))
//	free(p);
//	p = NULL;
//	return 0;
//}


//柔性数组的特点：
//1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
//2.sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
//3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配，
//  并且分配的内存应该⼤于结构的⼤⼩，以适应柔性数组的预期⼤⼩。
//struct S
//{
//	int i;
//	//int a[0];
//	int a[];//柔性数组成员
//}a;
//方案一
//struct S
//{
//	char c;
//	int n;
//	int arr[0];
//};
//int main()
//{
//	struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));
//	if (ps == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	//赋值
//	ps->c = 'w';
//	ps->n = 100;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		ps->arr[i] = i + 1;
//	}
//	//数组空间不够 开辟空间
//	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 15 * sizeof(int));
//	if (ptr == NULL)
//	{
//		perror("realloc");
//		return 1;
//	}
//	else
//	{
//		ps = ptr;
//	}
//	//继续赋值
//	for (i = 10; i < 15; i++)
//	{
//		ps->arr[i] = i + 1;
//	}
//	//打印
//	printf("%c\n%d\n", ps->c, ps->n);
//	for (i = 0; i < 15; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//	free(ps);
//	ps = NULL;
//
//	return 0;
//}
//
////方案二
//struct T
//{
//	char c;
//	int n;
//	int* arr;
//};
//int main()
//{
//	struct T* ps = (struct T*)malloc(sizeof(struct T));
//	if (ps == NULL)
//	{
//		perror("malloc");
//		return 1;
//	}
//	ps->arr = (int*)malloc(10 * sizeof(int));
//	if (ps->arr == NULL)
//	{
//		perror("malloc-2");
//		return 1;
//	}
//	//赋值
//	ps->c = 'w';
//	ps->n = 100;
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		ps->arr[i] = i + 1;
//	}
//	//不满足需求 需要开辟空间
//	int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));
//	if (ptr != NULL)
//	{
//		ps->arr = ptr;
//	}
//	else
//	{
//		perror("realloc");
//		return 1;
//	}
//	//再继续赋值
//	for (i = 10; i < 15; i++)
//	{
//		ps->arr[i] = i + 1;
//	}
//	//打印
//	printf("%c\n%d\n", ps->c, ps->n);
//	for (i = 0; i < 15; i++)
//	{
//		printf("%d ", ps->arr[i]);
//	}
//	free(ps->arr);
//	ps->arr = NULL;
//	free(ps);
//	ps = NULL;
//
//	return 0;
//}

